/*
 * NetWorkServer.h
 *
 *	网络服务.有接受数据和发送数据两个线程。
 *
 *  Created on: 2014-1-7
 *      Author: root
 */

#ifndef NETWORKSERVER_H_
#define NETWORKSERVER_H_

#include <pthread.h>
#include <unistd.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include <vector>
#include <ctime>

#include "../common/ClientClass.h"

#define SOCKET_MAX_BACKLOG 30
#define MAX_ENENTS 50
#define RECIVE_SIZE 1024

namespace miniGameServer {

class NetWorkServer {
public:
	NetWorkServer();
	virtual ~NetWorkServer();

	/**
	 * 启动一个线程，这个线程单独处理网络
	 */
	int startServer(char *host,int port,int maxClietn = 500);
	/**
	 * 结束网络线程
	 */
	int stopServer();

	/**
	 * 线程运行到标志，1正常运行，0，结束运行
	 */
	int workFlag;

	/**
	 * 当前network进程的id
	 */
	pthread_t threadid;

	/*
	 * 写进程的id
	 */
	pthread_t writeThreadId;

	//测试所有到链接，看是不是超时了.
	bool testAllClientKick();
private:

	/**
	 * thread start function
	 */
	static void * threadStart(void *arg);


	//////////////////////////////

	void createEpoll();

	int epollMaxClient;

	int port;

	char *host;

	int listen_sock,conn_sock,nfds,epollfd;

	/*
	 * 开启一个写进程
	 */
	static void *writeThreadEnter(void *arg);
	//真正的写函数
	void realWrite();

	//上一次测试可踢列表的时间
	time_t lastTestKickTime;

	//关闭一个客户端
	void closeOneClient(ClientClass *cc);
};

}

#endif /* NETWORKSERVER_H_ */
